In [2]:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import cv2
import numpy as np

#função que converte a imagem para níveis de cinza, de acordo com Y = 0.30 R + 0.55 G + 0.15 B.
def rgbTogray(rgb):
    return np.dot(rgb[...,:3], [0.3, 0.55, 0.15])

# carrega imagem pessoal de qualidade 1024 x 1024
img = mpimg.imread('foto_lindeberg.jpeg')     

#converte a image para níveis de cinza
img_gray = rgbTogray(img)    

# calcula a fft da imagem
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza '), plt.xticks([]), plt.yticks([])
Out[2]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza '),
 ([], []),
 ([], []))
In [3]:
kernel1= np.ones((3, 3), np.float32) / 9
kernel2= np.ones((5, 5), np.float32) / 25
kernel3= np.ones((9, 9), np.float32) / 81
In [4]:
#convolução com o kernel1 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel1)

# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada - kernel1'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada - kernel1'), plt.xticks([]), plt.yticks([])
Out[4]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada - kernel1'),
 ([], []),
 ([], []))
In [5]:
#convolução com o kernel2 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel2)

# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada - kernel2'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada - kernel2'), plt.xticks([]), plt.yticks([])
Out[5]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada - kernel2'),
 ([], []),
 ([], []))
In [6]:
#convolução com o kernel3 (passa-baixa)
img_gray_filtered = cv2.filter2D(img_gray, -1, kernel3)

# calcula a fft da imagem
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada - kernel3'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada - kernel3'), plt.xticks([]), plt.yticks([])
Out[6]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada - kernel3'),
 ([], []),
 ([], []))
In [7]:
#Borrar a imagem no domínio de Fourier (filtros iguais ao da convolução);
from scipy import fftpack

kernel = kernel1

# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])  

# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')

# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)

# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa  e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))

# calcula a fft da imagem
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada no domínio de Fourier (kernel1)'), plt.xticks([]), plt.yticks([])


# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel1)'), plt.xticks([]), plt.yticks([])
C:\Users\lindeberg.lpl\anaconda3\lib\site-packages\scipy\fftpack\basic.py:160: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  z[index] = x
Out[7]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel1)'),
 ([], []),
 ([], []))
In [8]:
kernel = kernel2

# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])  

# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')

# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)

# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa  e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))

# calcula a fft da imagem
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada no domínio de Fourier (kernel2)'), plt.xticks([]), plt.yticks([])


# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel2)'), plt.xticks([]), plt.yticks([])
C:\Users\lindeberg.lpl\anaconda3\lib\site-packages\scipy\fftpack\basic.py:160: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  z[index] = x
Out[8]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel2)'),
 ([], []),
 ([], []))
In [9]:
kernel = kernel3

# número total de padding
sz = (img.shape[0] - kernel.shape[0], img.shape[1] - kernel.shape[1])  

# adiciona padding ao kernel
kernel = np.pad(kernel, (((sz[0]+1)//2, sz[0]//2), ((sz[1]+1)//2, sz[1]//2)), 'constant')

# realiza o shift no kernel
kernel = fftpack.ifftshift(kernel)

# calcula a ffft da image e do kernel e realiza o produto. Depois calcula a fft inversa  e considera apenas a parte real
img_gray_filtered = np.real(fftpack.ifft2(fftpack.fft2(img_gray) * fftpack.fft2(kernel)))

# calcula a fft da imagem
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a imagem orinal em nível de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# mostra o espetro de frequência da imagem
plt.subplot(222),plt.imshow(img_gray_filtered, cmap = 'gray')
plt.title('Imagem original em níveis de cinza borrada no domínio de Fourier (kernel3)'), plt.xticks([]), plt.yticks([])


# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_gray_filtered)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel3)'), plt.xticks([]), plt.yticks([])
C:\Users\lindeberg.lpl\anaconda3\lib\site-packages\scipy\fftpack\basic.py:160: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  z[index] = x
Out[9]:
(Text(0.5, 1.0, 'Espectro da imagem original em níveis de cinza borrada no domínio de Fourier (kernel3)'),
 ([], []),
 ([], []))
In [10]:
# Borrar a imagem no domínio de Fourier (filtro "ideal");

dft = cv2.dft(np.float32(img_gray),flags = cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)

rows, cols = img_gray.shape
crow,ccol = int(rows/2) , int(cols/2)

# cria uma mascara, no centro há uns e nas extremidades zeros
mask = np.zeros((rows,cols,2),np.uint8)
mask[crow-50:crow+50, ccol-50:ccol+50] = 1

# aplica a mascara e calcula a fft inversa
fshift = dft_shift*mask
f_ishift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_ishift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

# define o tamanho da imagem
plt.subplots(figsize=(15,15))

# mostra a image orinal em escala de cinza
plt.subplot(221),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])

#mostra a imagem borrada no domínio de fourier
plt.subplot(222),plt.imshow(img_back, cmap = 'gray')
plt.title('Imagem borrada no domínio de Fourier (filtro "ideal")'), plt.xticks([]), plt.yticks([])
plt.show()


# calcula a fft da imagem original
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em níveis de cinza'), plt.xticks([]), plt.yticks([])


# calcula a fft da imagem barrada no domínio de fourier 
f = np.fft.fft2(img_back)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem borrada no domínio de Fourier  (filtro "ideal")'), plt.xticks([]), plt.yticks([])
Out[10]:
(Text(0.5, 1.0, 'Espectro da imagem borrada no domínio de Fourier  (filtro "ideal")'),
 ([], []),
 ([], []))
In [11]:
# Passa alta da imagem

#from scipy import ndimage

data = np.array(img_gray, dtype=float)


# filtro passa alta
kernel = np.array([[-1, -1, -1, -1, -1],
                   [-1,  1,  2,  1, -1],
                   [-1,  2,  4,  2, -1],
                   [-1,  1,  2,  1, -1],
                   [-1, -1, -1, -1, -1]])

# convolução com o passa-alta
highpass_5x5 = cv2.filter2D(data, -1, kernel)

plt.subplots(figsize=(15,15))

# mostra a imagem original
plt.subplot(121),plt.imshow(data, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])

# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(highpass_5x5, cmap = 'gray')
plt.title('Imagem filtrada pelo passa-alta'), plt.xticks([]), plt.yticks([])
plt.show()


# calcula a fft da imagem original
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])


# calcula a fft da imagem filtrada pela passa-alta
f = np.fft.fft2(highpass_5x5)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem filtrada pelo passa-alta'), plt.xticks([]), plt.yticks([])
Out[11]:
(Text(0.5, 1.0, 'Espectro da imagem filtrada pelo passa-alta'),
 ([], []),
 ([], []))
In [12]:
#Realce de imagem usando o resíduo do passa baixas (2 intensidades)
# foi utilizado o kernel1 passa-baixa
img_gray_filtered_LP = cv2.filter2D(img_gray, -1, kernel1)

# subtração entre a imagem original e o passa-baixa, resultando na imagem filtrada pelo passa-alta
img_gray_filtered_HP = img_gray - img_gray_filtered_LP
# realce na image com adição de uma percentual do passa-alta
Imagem_realce= img_gray + 0.8*img_gray_filtered_HP

plt.subplots(figsize=(15,15))

# mostra a imagem original
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])

# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(Imagem_realce, cmap = 'gray')
plt.title('Imagem realçada'), plt.xticks([]), plt.yticks([])
plt.show()


# calcula a fft da imagem original
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])


# calcula a fft da imagem filtrada pelo passa-alta
f = np.fft.fft2(Imagem_realce)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem realçada'), plt.xticks([]), plt.yticks([])
Out[12]:
(Text(0.5, 1.0, 'Espectro da imagem realçada'), ([], []), ([], []))
In [13]:
#Realce de imagem usando o resíduo do passa baixas (2 intensidades)
# foi utilizado o kernel3 passa-baixa
img_gray_filtered_LP = cv2.filter2D(img_gray, -1, kernel3)

# subtração entre a imagem original e o passa-baixa, resultando na imagem filtrada pelo passa-alta
img_gray_filtered_HP = img_gray - img_gray_filtered_LP
# realce na image com adição de uma percentual do passa-alta
Imagem_realce= img_gray + 0.8*img_gray_filtered_HP

plt.subplots(figsize=(15,15))

# mostra a imagem original
plt.subplot(121),plt.imshow(img_gray, cmap = 'gray')
plt.title('Imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])

# mostra a imagem filtrada pelo passa-alta
plt.subplot(122),plt.imshow(Imagem_realce, cmap = 'gray')
plt.title('Imagem realçada'), plt.xticks([]), plt.yticks([])
plt.show()


# calcula a fft da imagem original
f = np.fft.fft2(img_gray)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra o espetro de frequência da imagem
plt.subplot(223),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original em escala de cinza'), plt.xticks([]), plt.yticks([])


# calcula a fft da imagem filtrada pelo passa-alta
f = np.fft.fft2(Imagem_realce)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# mostra o espetro de frequência da imagem
plt.subplot(224),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem realçada'), plt.xticks([]), plt.yticks([])
Out[13]:
(Text(0.5, 1.0, 'Espectro da imagem realçada'), ([], []), ([], []))
In [14]:
from PIL import Image
img = img_gray

# ruído gaussiano que será inserido na imagem
noise = np.random.randn(img.shape[0], img.shape[1])
img = img.astype('int16')

# imagem com ruído
img_noise = img + noise * 20
img_noise = np.clip(img_noise, 0, 255)
img_noise = img_noise.astype('uint8')


# calcula a fft da imagem com ruído
f = np.fft.fft2(img_noise)

# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

plt.subplot(121),plt.imshow(img_noise, cmap = 'gray')
plt.title('Imagem original com ruído gaussiano'), plt.xticks([]), plt.yticks([])


plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem original com ruído gaussiano'), plt.xticks([]), plt.yticks([])
Out[14]:
(Text(0.5, 1.0, 'Espectro da imagem original com ruído gaussiano'),
 ([], []),
 ([], []))
In [15]:
# Filtragem de ruídos gaussianos usando passa baixas
#A maior utilização dos filtros passa baixas é na remoção de ruídos eletrônicos, comuns em imagens de S.R.
#O grande problema desse tipo de filtro é que o efeito colateral produzido equivale
#a "desfocar" a imagem toda e, consequentemente, perder informações de detalhe.

kernel = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]]) 

# filtragem do ruído gaussiano utiliando filtro passa-baixa (kernel3)
img_denoised = cv2.filter2D(img_noise, -1, kernel3)


# calcula a fft da imagem
f = np.fft.fft2(img_denoised)

# deslocar a origem para o meio da imagem para facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# imagem com ruído gaussiando filtrada por filtro passa-baixa
plt.subplot(121),plt.imshow(img_denoised, cmap = 'gray')
plt.title('Imagem filtrada pelo filtro passa-baixa'), plt.xticks([]), plt.yticks([])

# espectro de imagem com ruído gaussiando filtrada pelo filtro passa-baixa
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem filtrada pelo filtro passa-baixa'), plt.xticks([]), plt.yticks([])
Out[15]:
(Text(0.5, 1.0, 'Espectro da imagem filtrada pelo filtro passa-baixa'),
 ([], []),
 ([], []))
In [16]:
# Filtragem de ruídos impulsivos usando filtro de mediana

img = img_gray
row,col = img.shape
s_vs_p = 0.7
amount = 0.05
out = np.copy(img)
# Salt mode
num_salt = np.ceil(amount * img.size * s_vs_p)
coords = [np.random.randint(0, i - 1, int(num_salt)) for i in img.shape]
out[coords] = 1

      # Pepper mode
num_pepper = np.ceil(amount* img.size * (1. - s_vs_p))
coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in img.shape] 
out[coords] = 0
      
img = out
C:\Users\lindeberg.lpl\anaconda3\lib\site-packages\ipykernel_launcher.py:11: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  # This is added back by InteractiveShellApp.init_path()
C:\Users\lindeberg.lpl\anaconda3\lib\site-packages\ipykernel_launcher.py:16: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  app.launch_new_instance()
In [17]:
# calcula a fft da imagem
f = np.fft.fft2(img)
# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)
#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

# calcula a fft da imagem
f = np.fft.fft2(img_denoised)

# deslocar a origem para o meio da imagem
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra a imagem com ruídos impulsivos - salt & pepper
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Imagem com ruídos impulsivos - salt & pepper'), plt.xticks([]), plt.yticks([])

# motra o espectro da imagem com ruídos impulsivos - salt & pepper
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem com ruídos impulsivos - salt & pepper'), plt.xticks([]), plt.yticks([])
Out[17]:
(Text(0.5, 1.0, 'Espectro da imagem com ruídos impulsivos - salt & pepper'),
 ([], []),
 ([], []))
In [18]:
from scipy import ndimage

# Imagem filtrado pelo filtro de mediana. A utilização direta da função mediana foi autorizada pelo prof. Queiroz
resultado = ndimage.median_filter(img, size=3)

# calcula a fft da imagem
f = np.fft.fft2(resultado)

# deslocar a origem para o meio da imagem paa facilitar a visualização
fshift = np.fft.fftshift(f)

#centrado em log|z|
magnitude_spectrum = np.log(np.abs(fshift))

plt.subplots(figsize=(15,15))

# mostra a imagem após aplicação do filtro de mediana 
plt.subplot(121),plt.imshow(resultado, cmap = 'gray')
plt.title('Imagem após aplicação do filtro de mediana'), plt.xticks([]), plt.yticks([])

#mostra o espectro da imagem após aplicação do filtro de mediana
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Espectro da imagem após aplicação do filtro de mediana'), plt.xticks([]), plt.yticks([])
Out[18]:
(Text(0.5, 1.0, 'Espectro da imagem após aplicação do filtro de mediana'),
 ([], []),
 ([], []))